package com.gitee.faster.webdav.kernel.resource;

import com.gitee.faster.webdav.common.structure.RangeValue;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

/**
 * 资源库
 * 提供资源的常用方法接口
 *
 * @author hongda.li
 */
public interface ResourceRepository {

    /**
     * 对于给定的路径，是否接受处理
     *
     * @param requestPath 请求路径
     * @return 是否接受
     */
    boolean accept(String requestPath);

    /**
     * 将请求路径转为资源
     *
     * @param requestPath 请求路径
     * @return 创建结果
     */
    Resource transform(String requestPath);

    /**
     * 获取根目录
     *
     * @return 根目录
     */
    Resource getRoot();

    /**
     * 创建目录
     *
     * @param resource 资源
     */
    void mkdir(Resource resource);

    /**
     * 删除文件或目录
     * 如果是目录则递归删除目录下的文件
     *
     * @param resource 资源
     */
    void delete(Resource resource);

    /**
     * 递归查询资源
     *
     * @param resource 根资源
     * @param depth    递归深度
     * @return 查询结果
     */
    List<Resource> walk(Resource resource, int depth);

    /**
     * 上传文件
     *
     * @param resource 待上传资源
     * @param stream   待上传数据
     */
    void upload(Resource resource, InputStream stream);

    /**
     * 全量下载文件
     *
     * @param resource     待下载资源
     * @param outputStream 响应流
     */
    void download(Resource resource, OutputStream outputStream);

    /**
     * 分段下载文件
     *
     * @param resource     待下载资源
     * @param outputStream 响应流
     * @param range        范围值
     */
    void downloadPart(Resource resource, OutputStream outputStream, RangeValue range);
}
